Loading required package: spam
Loading required package: dotCall64
Loading required package: grid
Spam version 2.7-0 (2021-06-25) is loaded.
Type 'help( Spam)' or 'demo( spam)' for a short introduction
and overview of this package.
Help for individual functions is also obtained by adding the
suffix '.spam' to the function name, e.g. 'help( chol.spam)'.
Attaching package: ‘spam’
The following objects are masked from ‘package:base’:
backsolve, forwardsolve
Loading required package: viridis
Loading required package: viridisLite
See https://github.com/NCAR/Fields for
an extensive vignette, other supplements and source code
Loading required package: lhs
Loading required package: parallel
Loading required package: viztools
Loading required package: usethis
[1] “baresoilFrac_lnd_mean_ens_ssp585_S3” “c3PftFrac_lnd_mean_ens_ssp585_S3” “c4PftFrac_lnd_mean_ens_ssp585_S3”
[4] “cSoil_ens_ssp585_S3” “cVeg_ens_ssp585_S3” “fHarvest_lnd_sum_ens_ssp585_S3”
[7] “fLuc_lnd_sum_ens_ssp585_S3” “lai_lnd_mean_ens_ssp585_S3” “nbp_ens_ssp585_S3”
[10] “npp_ens_ssp585_S3” “rh_lnd_sum_ens_ssp585_S3” “shrubFrac_lnd_mean_ens_ssp585_S3”
[13] “treeFrac_lnd_mean_ens_ssp585_S3”


Which ensemble members match constraints?
Start with Level 2 (Andy’s constraints in NPP, NBP, cSoil and cVeg)
Timeseries of absolute vales

Anomaly timeseries

Include baresoil fraction data

Anomaly timeseries AW + baresoil

End-Of-Century values under various constraints
Starting with AW constraints (level 2) and then bare soil (level3)
Histograms of end-of-century absolute values


Histograms of end-of-century changes (anomaly from preindustrial)


Adding cumulative NBP as a constraint
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[,1] [,2] [,3]
[1,] 1 3 6
[2,] 4 9 15
[3,] 7 15 24

Cumulative NBP in the level 4 constrained ensemble

[1] 37
[1] 12.8
[1] 6
The carbon cycle in level 4 constrained ensemble

rank the level5 members by their 2100 values
2100
139.5931
[1] -175.275401 -6.008088 139.593092 249.892286


Indices in the design of the test set
[1] "param-perturb-P0918.conf" "param-perturb-P0812.conf" "param-perturb-P0999.conf" "param-perturb-P0811.conf"
[1] 918 812 999 811
LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgSlVMRVMxcDAgZW5zZW1ibGUgU1NQNTg1IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwotLS0KCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CiMgTG9hZCBoZWxwZXIgZnVuY3Rpb25zCgprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLnBhdGggPSAiZmlncy8iLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZ3MgPSBGQUxTRSkKCgpgYGAKCmBgYHtyfQoKc291cmNlKCJKVUxFUy1FUy0xcDAtY29tbW9uLXBhY2thZ2VzLlIiKQpzb3VyY2UoIkpVTEVTLUVTLTFwMC1jb21tb24tZnVuY3Rpb25zLlIiKQpgYGAKCgpgYGB7cn0KCmxpbmVQbG90TXVsdGlFbnMgPC0gZnVuY3Rpb24oeWVhcnMsIGVuczEsIGVuczIsIGNvbDEsIGNvbDIsIHlsYWIsIG1haW4sIHlsaW0gPSBOVUxMKXsKICAjIFBsb3Qgd2F2ZTAwIGFuZCB3YXZlMDEgdGltZXNlcmllcyBvbiB0b3Agb2Ygb25lIGFub3RoZXIKICAKICBudCA8LSBsZW5ndGgoeWVhcnMpIAogIGlmKGlzLm51bGwoeWxpbSkpewogICAgCiAgI3lsaW0gPSByYW5nZShjKGVuczFbLDFdLCBlbnMxWyxudF0sIGVuczJbLDFdLCBlbnMyWyAsbnRdKSkKICB5bGltID0gcmFuZ2UoYyhlbnMxLGVuczIpKQogIH0KICAKICBlbHNlIHlsaW0gPC0geWxpbQogIAogIG1hdHBsb3QoeWVhcnMsIHQoZW5zMSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IGNvbDEsCiAgICAgICAgeWxhYiA9IHlsYWIsIG1haW4gPSBtYWluLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nLCBsd2QgPSAxLjUpCiAgbWF0bGluZXMoeWVhcnMsIHQoZW5zMiksIGNvbCA9IGNvbDIsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDEuNSkKfQoKCm1ha2VUaW1lc2VyaWVzRW5zZW1ibGVTU1AgPC0gZnVuY3Rpb24oZW5zbG9jLCB2YXJpYWJsZSwgbnN0YXJ0LCBuZW5kLCBjbiA9IDE4NTA6MjEwMCl7CiAgCiAgeXNlYyA8LSAzMTUzNjAwMAogIAogIG5lbnMgPC0gKG5lbmQgLSBuc3RhcnQpICsgMQogICMgbmVucyBpcyBudW1iZXIgb2YgZW5zZW1ibGUgbWVtYmVycwogICMgbnRzIGxlbmd0aCBvZiB0aW1lc2VyaWVzCiAgIyBjbiBpcyBjb2xuYW1lcygpCiAgZGF0bWF0IDwtIG1hdHJpeChOQSwgbnJvdyA9IG5lbnMsIG5jb2wgPSBsZW5ndGgoY24pKQogIGNvbG5hbWVzKGRhdG1hdCkgPC0gY24KICAKICBlbnNsaXN0IDwtIHBhc3RlKCJQIiwgZm9ybWF0Qyhuc3RhcnQ6bmVuZCwgd2lkdGg9NCwgZmxhZz0iMCIpLCBzZXA9IiIpCiAgCiAgZm9yKGkgaW4gMTpuZW5zKXsKICAgIAogICAgZW5zbWVtYmVyIDwtIGVuc2xpc3RbaV0KICAgIAogICAgZm4gPC0gcGFzdGUwKGVuc2xvYywnSlVMRVMtRVMtMXAwXycsZW5zbWVtYmVyLCdfQW5udWFsX2dsb2JhbC5uYycpCiAgICAKICAgIHRyeShuYyA8LSBuY19vcGVuKHBhc3RlMChmbikpKQogICAgI3RyeShsb2NhbHRpbWUgPC0gbmN2YXJfZ2V0KG5jLCAndGltZScpKQogICAgCiAgICAjIFRoaXMgcGFydCBjb21wZW5zYXRlcyBmb3IgdGhlIGZhY3QgdGhhdCBzb21ldGltZXMgeWVhcnMgYXJlIG1pc3NpbmcKICAgICN0cnkobG9jYWx5ZWFyIDwtIGZsb29yKDIxMDAgKyAobG9jYWx0aW1lIC8geXNlYykpKQogICAgI3RyeShpeCA8LSB3aGljaChjbiVpbiVsb2NhbHllYXIpKQogICAgCiAgICB0cnkoZGF0IDwtIGV4dHJhY3RUaW1lc2VyaWVzKG5jLCB2YXJpYWJsZSkpCiAgICAKICAgIHRyeShkYXRtYXRbaSwgXSA8LSBkYXQpCiAgICBuY19jbG9zZShuYykKICB9CiAgZGF0bWF0Cn0KCmdldFN0YW5kYXJkTWVtYmVyU1NQIDwtIGZ1bmN0aW9uKGVuc2xvYywgdmFyaWFibGUsIG50cyA9IDI1MSwgY24gPSAxODUwOjIxMDApewogIAogIGRhdG1hdCA8LSBtYXRyaXgoTkEsIG5yb3cgPSAxLCBuY29sID0gbnRzKQogIGNvbG5hbWVzKGRhdG1hdCkgPC0gY24KICAKICBlbnNtZW1iZXIgPC0gJ1MzJwogICNmbiA8LSBwYXN0ZTAoZW5zbG9jLGVuc21lbWJlciwnL3N0YXRzLycsJ0pVTEVTLUVTLTFwMF8nLGVuc21lbWJlciwnX0FubnVhbF9nbG9iYWwubmMnKQogIGZuIDwtIHBhc3RlMChlbnNsb2MsJ0pVTEVTLUVTLTFwMF8nLGVuc21lbWJlciwnX0FubnVhbF9nbG9iYWwubmMnKQogIAogIHRyeShuYyA8LSBuY19vcGVuKHBhc3RlMChmbikpKQogIHRyeShkYXQgPC0gZXh0cmFjdFRpbWVzZXJpZXMobmMsIHZhcmlhYmxlKSkKICAKICBkYXRtYXRbMSwgXSA8LSBkYXQKICBuY19jbG9zZShuYykKICBkYXRtYXQKICAKfQoKCgpgYGAKCgoKYGBge3J9CgoKZW5zbG9jX3NzcDU4NV9TMyA8LSAnL2RhdGEvdXNlcnMvaGFkYXcvSlVMRVNfRVNfUFBFL3UtY2Y5MzIvJwplbnNsb2Nfc3NwNTg1X1JBRCA8LSAnL2RhdGEvdXNlcnMvaGFkYXcvSlVMRVNfRVNfUFBFL3UtY2s2NDcvJwoKeXNlYyA9IDYwKjYwKjI0KjM2NQpzc3B5ZWFycyA8LSAxODUwOjIxMDAKCgoKYGBgCgoKYGBge3J9CnlfbmFtZXNfc2VsZWN0X3NzcDU4NSA8LSAgYygibnBwIiwgIm5icCIsICJjU29pbCIsICJjVmVnIiwKICAgICAgICAgICAgICAgICAgICAgImxhaV9sbmRfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICJyaF9sbmRfc3VtIiAsICJmTHVjX2xuZF9zdW0iLCAiZkhhcnZlc3RfbG5kX3N1bSIsICAKICAgICAgICAgICAgICAgICAgICAgInRyZWVGcmFjX2xuZF9tZWFuIiAsICJiYXJlc29pbEZyYWNfbG5kX21lYW4iLAogICAgICAgICAgICAgICAgICAgICAic2hydWJGcmFjX2xuZF9tZWFuIiwgImMzUGZ0RnJhY19sbmRfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICJjNFBmdEZyYWNfbG5kX21lYW4iICAgCikKCnNlbGVjdF91bml0cyA8LSBjKCdHdEMveWVhcicsICdHdEMveWVhcicsICdHdEMnLCAnR3RDJywgJ2luZGV4JywgJ0d0Qy95ZWFyJywnR3RDL3llYXInLCAnR3RDL3llYXInLCAnJScsICclJywgJyUnLCAnJScsICclJykKbmFtZXMoc2VsZWN0X3VuaXRzKSA8LSB5X25hbWVzX3NlbGVjdF9zc3A1ODUKCiMgSGlzdG9ncmFtcyBvZiBlbmQgb2YgY2VudHVyeSB2YWx1ZXMKeXZlY19zc3A1ODUgPC0gcGFzdGUwKHlfbmFtZXNfc2VsZWN0X3NzcDU4NSwgIl9lbnNfc3NwNTg1X1MzIikKCnl2ZWNfYW5vbV9zc3A1ODUgPC0gcGFzdGUwKHlfbmFtZXNfc2VsZWN0X3NzcDU4NSwgIl9lbnNfYW5vbV9zc3A1ODVfUzMiKQoKYGBgCgpbMV0gImJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzIiAiYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMiICAgICJjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyIgICAKIFs0XSAiY1NvaWxfZW5zX3NzcDU4NV9TMyIgICAgICAgICAgICAgICAgICJjVmVnX2Vuc19zc3A1ODVfUzMiICAgICAgICAgICAgICAgICAgImZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3NzcDU4NV9TMyIgICAgIAogWzddICJmTHVjX2xuZF9zdW1fZW5zX3NzcDU4NV9TMyIgICAgICAgICAgImxhaV9sbmRfbWVhbl9lbnNfc3NwNTg1X1MzIiAgICAgICAgICAibmJwX2Vuc19zc3A1ODVfUzMiICAgICAgICAgICAgICAgICAgClsxMF0gIm5wcF9lbnNfc3NwNTg1X1MzIiAgICAgICAgICAgICAgICAgICAicmhfbG5kX3N1bV9lbnNfc3NwNTg1X1MzIiAgICAgICAgICAgICJzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyIgICAKWzEzXSAidHJlZUZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyIgCgoKCmBgYHtyfQoKaWYgKGZpbGUuZXhpc3RzKCJlbnNlbWJsZV90aW1lc2VyaWVzX3NzcF8yMDIyLTA4LTA5LnJkYXRhIikpIHsKICBsb2FkKCJlbnNlbWJsZV90aW1lc2VyaWVzX3NzcF8yMDIyLTA4LTA5LnJkYXRhIikKfSBlbHNlIHsKICAKICAjIHByaW1hcnkgY2FyYm9uIGN5Y2xlIG91dHB1dHMKICBucHBfZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gIm5wcF9ubGltX2xuZF9zdW0iLCBjbiA9IHNzcHllYXJzKSAvICgxZTEyL3lzZWMpCiAgCiAgbmJwX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJuYnBfbG5kX3N1bSIsIGNuID0gc3NweWVhcnMpIC8gKDFlMTIveXNlYykKICAKICBjU29pbF9lbnNfc3NwNTg1X1MzIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGVTU1AoZW5zbG9jID0gZW5zbG9jX3NzcDU4NV9TMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zdGFydCA9IDQ5OSwgbmVuZCA9IDk5OSwgdmFyaWFibGUgPSAiY1NvaWxfbG5kX3N1bSIsIGNuID0gc3NweWVhcnMpIC8gMWUxMgogIAogIGNWZWdfZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gImNWZWdfbG5kX3N1bSIsIGNuID0gc3NweWVhcnMpIC8gMWUxMgogIAogIGxhaV9sbmRfbWVhbl9lbnNfc3NwNTg1X1MzIDwtIG1ha2VUaW1lc2VyaWVzRW5zZW1ibGVTU1AoZW5zbG9jID0gZW5zbG9jX3NzcDU4NV9TMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zdGFydCA9IDQ5OSwgbmVuZCA9IDk5OSwgdmFyaWFibGUgPSAibGFpX2xuZF9tZWFuIiwgY24gPSBzc3B5ZWFycykKICAKICAjIGZsdXhlcwogIHJoX2xuZF9zdW1fZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gInJoX2xuZF9zdW0iLCBjbiA9IHNzcHllYXJzKSAvICgxZTEyL3lzZWMpCiAgCiAgZkx1Y19sbmRfc3VtX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJmTHVjX2xuZF9zdW0iLCBjbiA9IHNzcHllYXJzKSAvICgxZTEyL3lzZWMpCiAKICBmSGFydmVzdF9sbmRfc3VtX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJmSGFydmVzdF9sbmRfc3VtIiwgY24gPSBzc3B5ZWFycykgLyAoMWUxMi95c2VjKQogIAogICMgZnJhY3Rpb25zCiAgdHJlZUZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gInRyZWVGcmFjX2xuZF9tZWFuIiwgY24gPSBzc3B5ZWFycykKCiAgc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJzaHJ1YkZyYWNfbG5kX21lYW4iLCBjbiA9IHNzcHllYXJzKSAgCiAgCiAgYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJiYXJlc29pbEZyYWNfbG5kX21lYW4iLCBjbiA9IHNzcHllYXJzKSAgCiAgCiAgYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMgPC0gbWFrZVRpbWVzZXJpZXNFbnNlbWJsZVNTUChlbnNsb2MgPSBlbnNsb2Nfc3NwNTg1X1MzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnN0YXJ0ID0gNDk5LCBuZW5kID0gOTk5LCB2YXJpYWJsZSA9ICJjM1BmdEZyYWNfbG5kX21lYW4iLCBjbiA9IHNzcHllYXJzKSAKICAKICBjNFBmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyA8LSBtYWtlVGltZXNlcmllc0Vuc2VtYmxlU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc3RhcnQgPSA0OTksIG5lbmQgPSA5OTksIHZhcmlhYmxlID0gImM0UGZ0RnJhY19sbmRfbWVhbiIsIGNuID0gc3NweWVhcnMpICAgCiAgCiAgc2F2ZShucHBfZW5zX3NzcDU4NV9TMywgbmJwX2Vuc19zc3A1ODVfUzMsIGNTb2lsX2Vuc19zc3A1ODVfUzMsIGNWZWdfZW5zX3NzcDU4NV9TMywgbGFpX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIHJoX2xuZF9zdW1fZW5zX3NzcDU4NV9TMywgZkx1Y19sbmRfc3VtX2Vuc19zc3A1ODVfUzMsIGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3NzcDU4NV9TMywKICAgICAgIHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIHNocnViRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzLCBiYXJlc29pbEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMyxjM1BmdEZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TMywgYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsCiAgICAgICBmaWxlID0gImVuc2VtYmxlX3RpbWVzZXJpZXNfc3NwXzIwMjItMDgtMDkucmRhdGEiICkKICAKfQoKCmBgYAoKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKIG5wcF9zdGFuX3NzcDU4NV9TMzwtIGdldFN0YW5kYXJkTWVtYmVyU1NQKGVuc2xvYyA9IGVuc2xvY19zc3A1ODVfUzMsIHZhcmlhYmxlID0gIm5wcF9ubGltX2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCiBuYnBfc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXJTU1AoZW5zbG9jID0gZW5zbG9jX3NzcDU4NV9TMywgdmFyaWFibGUgPSAibmJwX2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCiMgY1NvaWxfc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAiY1NvaWxfbG5kX3N1bSIpIC8gMWUxMgojIGNWZWdfc3Rhbl9zc3A1ODVfUzMgPC0gZ2V0U3RhbmRhcmRNZW1iZXIoZW5zbG9jID0gZW5zbG9jX3dhdmUwMCwgdmFyaWFibGUgPSAiY1ZlZ19sbmRfc3VtIikgLyAxZTEyCiMgbGFpX2xuZF9tZWFuX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gImxhaV9sbmRfbWVhbiIpCiMgCiMgCiMgIyBmbHV4ZXMKIyByaF9sbmRfc3VtX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gInJoX2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCiMgZkx1Y19sbmRfc3VtX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gImZMdWNfbG5kX3N1bSIpIC8gKDFlMTIveXNlYykKIyBmSGFydmVzdF9sbmRfc3VtX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gImZIYXJ2ZXN0X2xuZF9zdW0iKSAvICgxZTEyL3lzZWMpCiMgCiMgCiMgIyBmcmFjdGlvbnMKIyB0cmVlRnJhY19sbmRfbWVhbl9zdGFuX3NzcDU4NV9TMyA8LSBnZXRTdGFuZGFyZE1lbWJlcihlbnNsb2MgPSBlbnNsb2Nfd2F2ZTAwLCB2YXJpYWJsZSA9ICJ0cmVlRnJhY19sbmRfbWVhbiIpCiMgc2hydWJGcmFjX2xuZF9tZWFuX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gInNocnViRnJhY19sbmRfbWVhbiIpCiMgYmFyZXNvaWxGcmFjX2xuZF9tZWFuX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gImJhcmVzb2lsRnJhY19sbmRfbWVhbiIpCiMgYzNQZnRGcmFjX2xuZF9tZWFuX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gImMzUGZ0RnJhY19sbmRfbWVhbiIpCiMgYzRQZnRGcmFjX2xuZF9tZWFuX3N0YW5fc3NwNTg1X1MzIDwtIGdldFN0YW5kYXJkTWVtYmVyKGVuc2xvYyA9IGVuc2xvY193YXZlMDAsIHZhcmlhYmxlID0gImM0UGZ0RnJhY19sbmRfbWVhbiIpCgoKCmBgYAoKCmBgYHtyfQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIEFub21hbGl6ZSBlbnNlbWJsZQojIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpucHBfZW5zX2Fub21fc3NwNTg1X1MzIDwtIGFub21hbGl6ZVRTbWF0cml4KG5wcF9lbnNfc3NwNTg1X1MzLCAxOjIwKQpuYnBfZW5zX2Fub21fc3NwNTg1X1MzIDwtIGFub21hbGl6ZVRTbWF0cml4KG5icF9lbnNfc3NwNTg1X1MzLCAxOjIwKQpjU29pbF9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgoY1NvaWxfZW5zX3NzcDU4NV9TMywgMToyMCkKY1ZlZ19lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgoY1ZlZ19lbnNfc3NwNTg1X1MzLCAxOjIwKQoKcmhfbG5kX3N1bV9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgocmhfbG5kX3N1bV9lbnNfc3NwNTg1X1MzLCAxOjIwKQpmTHVjX2xuZF9zdW1fZW5zX2Fub21fc3NwNTg1X1MzIDwtIGFub21hbGl6ZVRTbWF0cml4KGZMdWNfbG5kX3N1bV9lbnNfc3NwNTg1X1MzLCAxOjIwKQpsYWlfbG5kX21lYW5fZW5zX2Fub21fc3NwNTg1X1MzIDwtIGFub21hbGl6ZVRTbWF0cml4KGxhaV9sbmRfbWVhbl9lbnNfc3NwNTg1X1MzLCAxOjIwKSAKCmZIYXJ2ZXN0X2xuZF9zdW1fZW5zX2Fub21fc3NwNTg1X1MzIDwtIGFub21hbGl6ZVRTbWF0cml4KGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3NzcDU4NV9TMywgMToyMCkKdHJlZUZyYWNfbG5kX21lYW5fZW5zX2Fub21fc3NwNTg1X1MzIDwtIGFub21hbGl6ZVRTbWF0cml4KHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIDE6MjApCnNocnViRnJhY19sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgoc2hydWJGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIDE6MjApCmJhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgoYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIDE6MjApCmMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgoYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIDE6MjApCmM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMgPC0gYW5vbWFsaXplVFNtYXRyaXgoYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMsIDE6MjApCgojdG90YWxfbGFuZF9jYXJib25fYW5vbSA8LSBhbm9tYWxpemVUU21hdHJpeCh0b3RhbF9sYW5kX2NhcmJvbl9lbnMsIDE6MjApCgoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCnRyYW5zcHZhbCA8LSAzMApsaW5lY29sID0gJ2JsYWNrJwoKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMSkpCgptYXRwbG90KHNzcHllYXJzLCB0KG5wcF9lbnNfc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ05QUCcsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KG5icF9lbnNfc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ05CUCcsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KGNTb2lsX2Vuc19zc3A1ODVfUzMpLCAKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ2NTb2lsJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCiAKbWF0cGxvdChzc3B5ZWFycyx0KGNWZWdfZW5zX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksIAogICAgICAgIG1haW4gPSAnY1ZlZycsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnICkKCm1hdHBsb3Qoc3NweWVhcnMsdChyaF9sbmRfc3VtX2Vuc19zc3A1ODVfUzMgKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ1JIJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQoZkx1Y19sbmRfc3VtX2Vuc19zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnZkx1YycsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KGxhaV9sbmRfbWVhbl9lbnNfc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ0xBSScsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX3NzcDU4NV9TMyksIAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnZkhhcnZlc3QnLCB4bGFiID0gJycsIHlsYWIgPSAnR3RDJykKCm1hdHBsb3Qoc3NweWVhcnMsdCh0cmVlRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ3RyZWVGcmFjJywgeGxhYiA9ICcnLCB5bGFiID0gJyUnKQoKbWF0cGxvdChzc3B5ZWFycyx0KHNocnViRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzKSwgCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdzaHJ1YkZyYWMnLCB4bGFiID0gJycsIHlsYWIgPSAnJScpCgptYXRwbG90KHNzcHllYXJzLHQoYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnYmFyZXNvaWxGcmFjJywgeGxhYiA9ICcnLCB5bGFiID0gJyUnKQoKbWF0cGxvdChzc3B5ZWFycyx0KGMzUGZ0RnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzKSwgdHlwZSA9ICdsJywgCiAgICAgICAgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdjM1BmdEZyYWMnLCB4bGFiID0gJycsIHlsYWIgPSAnJScpCgptYXRwbG90KHNzcHllYXJzLHQoYzRQZnRGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnYzRQZnRGcmFjJywgeGxhYiA9ICcnLHlsYWIgPSAnJScpCgoKYGBgCgoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9Cgp0cmFuc3B2YWwgPC0gMzAKbGluZWNvbCA9ICdibGFjaycKCnBhcihtZnJvdz0gYygzLDUpLCBsYXMgPSAxLCBtYXIgPSBjKDQsNCwxLDEpKQoKbWF0cGxvdChzc3B5ZWFycywgdChucHBfZW5zX2Fub21fc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ05QUCcsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KG5icF9lbnNfYW5vbV9zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnTkJQJywgeGxhYiA9ICcnLCB5bGFiID0gJ0d0QycpCgptYXRwbG90KHNzcHllYXJzLHQoY1NvaWxfZW5zX2Fub21fc3NwNTg1X1MzKSwgCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdjU29pbCcsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQogCm1hdHBsb3Qoc3NweWVhcnMsdChjVmVnX2Vuc19hbm9tX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksIAogICAgICAgIG1haW4gPSAnY1ZlZycsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnICkKCm1hdHBsb3Qoc3NweWVhcnMsdChyaF9sbmRfc3VtX2Vuc19hbm9tX3NzcDU4NV9TMyApLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnUkgnLCB4bGFiID0gJycsIHlsYWIgPSAnR3RDJykKCm1hdHBsb3Qoc3NweWVhcnMsdChmTHVjX2xuZF9zdW1fZW5zX2Fub21fc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ2ZMdWMnLCB4bGFiID0gJycsIHlsYWIgPSAnR3RDJykKCm1hdHBsb3Qoc3NweWVhcnMsdChsYWlfbG5kX21lYW5fZW5zX2Fub21fc3NwNTg1X1MzKSwKICAgICAgICB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQobGluZWNvbCwgdHJhbnNwdmFsKSwKICAgICAgICBtYWluID0gJ0xBSScsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KGZIYXJ2ZXN0X2xuZF9zdW1fZW5zX2Fub21fc3NwNTg1X1MzKSwgCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdmSGFydmVzdCcsIHhsYWIgPSAnJywgeWxhYiA9ICdHdEMnKQoKbWF0cGxvdChzc3B5ZWFycyx0KHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICd0cmVlRnJhYycsIHhsYWIgPSAnJywgeWxhYiA9ICclJykKCm1hdHBsb3Qoc3NweWVhcnMsdChzaHJ1YkZyYWNfbG5kX21lYW5fZW5zX2Fub21fc3NwNTg1X1MzKSwgCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdzaHJ1YkZyYWMnLCB4bGFiID0gJycsIHlsYWIgPSAnJScpCgptYXRwbG90KHNzcHllYXJzLHQoYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3NzcDU4NV9TMyksCiAgICAgICAgdHlwZSA9ICdsJywgbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KGxpbmVjb2wsIHRyYW5zcHZhbCksCiAgICAgICAgbWFpbiA9ICdiYXJlc29pbEZyYWMnLCB4bGFiID0gJycsIHlsYWIgPSAnJScpCgptYXRwbG90KHNzcHllYXJzLHQoYzNQZnRGcmFjX2xuZF9tZWFuX2Vuc19hbm9tX3NzcDU4NV9TMyksIHR5cGUgPSAnbCcsIAogICAgICAgIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnYzNQZnRGcmFjJywgeGxhYiA9ICcnLCB5bGFiID0gJyUnKQoKbWF0cGxvdChzc3B5ZWFycyx0KGM0UGZ0RnJhY19sbmRfbWVhbl9lbnNfYW5vbV9zc3A1ODVfUzMpLAogICAgICAgIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChsaW5lY29sLCB0cmFuc3B2YWwpLAogICAgICAgIG1haW4gPSAnYzRQZnRGcmFjJywgeGxhYiA9ICcnLHlsYWIgPSAnJScpCgoKYGBgCgoKIyMgV2hpY2ggZW5zZW1ibGUgbWVtYmVycyBtYXRjaCBjb25zdHJhaW50cz8KClN0YXJ0IHdpdGggTGV2ZWwgMiAoQW5keSdzIGNvbnN0cmFpbnRzIGluIE5QUCwgTkJQLCBjU29pbCBhbmQgY1ZlZykKCmBgYHtyfQoKaXhfbXYgPC0gd2hpY2goc3NweWVhcnMgJWluJSAxOTk2OjIwMTUpCgp5dmVjX2NvbnN0cmFpbnRzIDwtIGMoJ25wcF9lbnNfc3NwNTg1X1MzJywgJ25icF9lbnNfc3NwNTg1X1MzJywgJ2NTb2lsX2Vuc19zc3A1ODVfUzMnLCAnY1ZlZ19lbnNfc3NwNTg1X1MzJykKCiMgTWF0cml4IG9mIGNvbnN0cmFpbnQgb3V0cHV0IG1vZGVybiB2YWx1ZXMgKDE5OTYgLSAyMDE1KQpZX2NvbnN0X3NzcDU4NV9tdiA8LSBtYXRyaXgoZGF0YSA9IE5BLCBucm93ID0gbnJvdyhucHBfZW5zX3NzcDU4NV9TMyksIG5jb2wgPSBsZW5ndGgoeXZlY19jb25zdHJhaW50cykpCmNvbG5hbWVzKFlfY29uc3Rfc3NwNTg1X212KSA8LSB5dmVjX2NvbnN0cmFpbnRzCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX2NvbnN0cmFpbnRzKSl7CiAgCiAgWV90cnVuYyA8LSBnZXQoeXZlY19jb25zdHJhaW50c1tpXSlbLCBpeF9tdl0KICBZX3RydW5jX21lYW4gPC0gYXBwbHkoWV90cnVuYywgMSwgbWVhbiwgbmEucm0gPSBUUlVFKQogIFlfY29uc3Rfc3NwNTg1X212WyxpXSA8LSBZX3RydW5jX21lYW4KfQoKYGBgCgoKYGBge3J9CgpjcmVhdGVDb25zdHJhaW50U3RyaW5nIDwtIGZ1bmN0aW9uKHl2ZWMsIG1pbnMsIG1heGVzKXsKICAjIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyBhIGxvZ2ljYWwgZXhwcmVzc2lvbiBhcyBhIHN0cmluZyB0byBiZSBldmFsdWF0ZWQKICBvdXQgPC0gJ3doaWNoKCcKICAKICBmb3IoaSBpbiAxOmxlbmd0aCh5dmVjKSl7CiAgICAKICAgIGlmKGk8bGVuZ3RoKHl2ZWMpKXsKICAgICAgCiAgICBzdWJjb25zdCA8LSBwYXN0ZTAoJ1lfdW5pZicsJ1ssJywgJyInLHl2ZWNbaV0sJyInLCddJywgJz4nLCBtaW5zW2ldLCAnJicsICdZX3VuaWYnLCdbLCcsICciJyx5dmVjW2ldLCAnIicsJ10nICwgJzwnLCBtYXhlc1tpXSwgJyYnKQogICAgfQogICAgCiAgICBlbHNlewogICAgIHN1YmNvbnN0IDwtICBwYXN0ZTAoJ1lfdW5pZicsJ1ssJywgJyInLHl2ZWNbaV0sJyInLCddJywgJz4nLCBtaW5zW2ldLCAnJicsICdZX3VuaWYnLCdbLCcsICciJyx5dmVjW2ldLCAnIicsJ10nICwgJzwnLCBtYXhlc1tpXSkKICAgIH0KICAgb3V0IDwtICBwYXN0ZTAob3V0LCBzdWJjb25zdCkKICB9CiAgCiAgb3V0IDwtIHBhc3RlMChvdXQsICcpJykKfQoKCkFXX21pbnMgPC0gYygzNSwgMCwgNzUwLCAzMDApCkFXX21heGVzIDwtIGMoODAsIDEwMDAwLCAzMDAwLCA4MDApCgpZX3VuaWYgPC0gWV9jb25zdF9zc3A1ODVfbXYKaXhfa2VwdF9BVyA8LSBldmFsKHBhcnNlKHRleHQgPSBjcmVhdGVDb25zdHJhaW50U3RyaW5nKHl2ZWM9eXZlY19jb25zdHJhaW50cywgbWlucyA9IEFXX21pbnMsIG1heGVzID0gQVdfbWF4ZXMpKSkKCgoKI2V2YWwocGFyc2UodGV4dCA9IHBhc3RlMCgpKSkKCmlucHV0Q29uc3RyYWludFNpemUgPC0gZnVuY3Rpb24oWV91bmlmLCB5dmVjLCBtaW5zLCBtYXhlcyl7CiAgIyBDYWxjdWxhdGUgdGhlIGluZGljZXMgb2YgWV91bmlmIHRoYXQgYXJlIHdpdGhpbiB0aGUgYm91bmRzIHNldCBieSBtaW5zIGFuZCBtYXhlcwogIAogIAogIGl4X2tlcHQgPC0gZXZhbChwYXJzZSh0ZXh0ID0gY3JlYXRlQ29uc3RyYWludFN0cmluZyh5dmVjPXl2ZWMsIG1pbnMgPSBtaW5zLCBtYXhlcyA9IG1heGVzKSkpCiAgCiAgcHJvcF9rZXB0IDwtIGxlbmd0aChpeF9rZXB0KSAvIG5yb3coWV91bmlmKQogIAogIHJldHVybihsaXN0KGl4X2tlcHQgPSBpeF9rZXB0LCBwcm9wX2tlcHQgPSBwcm9wX2tlcHQpKQogIAp9CiAgCmBgYAoKIyMjIFRpbWVzZXJpZXMgb2YgYWJzb2x1dGUgdmFsZXMKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEyfQpsY29sX3dhdmUwMSA8LSBtYWtlVHJhbnNwYXJlbnQoJ2ZpcmVicmljaycsICA4MCkKbGNvbF93YXZlMDFfbGV2ZWwyIDwtIG1ha2VUcmFuc3BhcmVudCgnZ29sZCcsICA4MCkKc3RhbmNvbCA9ICdibGFjaycKCmxpbmVQbG90TXVsdGlFbnMgPC0gZnVuY3Rpb24oeWVhcnMsIGVuczEsIGVuczIsIGNvbDEsIGNvbDIsIHlsYWIsIG1haW4sIHlsaW0gPSBOVUxMKXsKICAjIFBsb3Qgd2F2ZTAwIGFuZCB3YXZlMDEgdGltZXNlcmllcyBvbiB0b3Agb2Ygb25lIGFub3RoZXIKICAKICBudCA8LSBsZW5ndGgoeWVhcnMpIAogIGlmKGlzLm51bGwoeWxpbSkpewogICAgCiAgI3lsaW0gPSByYW5nZShjKGVuczFbLDFdLCBlbnMxWyxudF0sIGVuczJbLDFdLCBlbnMyWyAsbnRdKSkKICB5bGltID0gcmFuZ2UoYyhlbnMxLGVuczIpKQogIH0KICAKICBlbHNlIHlsaW0gPC0geWxpbQogIAogIG1hdHBsb3QoeWVhcnMsIHQoZW5zMSksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcseWxpbSA9IHlsaW0sIGNvbCA9IGNvbDEsCiAgICAgICAgeWxhYiA9IHlsYWIsIG1haW4gPSBtYWluLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nLCBsd2QgPSAxLjUpCiAgbWF0bGluZXMoeWVhcnMsIHQoZW5zMiksIGNvbCA9IGNvbDIsIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDEuNSkKfQpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCnBhcihtZnJvdz0gYygzLDUpLCBsYXMgPSAxLCBtYXIgPSBjKDQsNCwxLDEpKQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19zc3A1ODUpKXsKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSBzc3B5ZWFycywgZW5zMSA9IGdldCh5dmVjX3NzcDU4NVtpXSksCiAgICAgICAgICAgICAgICAgZW5zMiA9IGdldCh5dmVjX3NzcDU4NVtpXSlbaXhfa2VwdF9BVywgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMDEsIGNvbDIgPSBsY29sX3dhdmUwMV9sZXZlbDIsCiAgICAgICAgICAgICAgICAgeWxhYiA9IHNlbGVjdF91bml0c1tpXSwgbWFpbiA9IHl2ZWNfc3NwNTg1W2ldKQogICAgICAgICAgICAgICAgIAp9CgpyZXNldCgpCgpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgbGVnZW5kID0gYygnd2F2ZTAxJywgJ3dhdmUwMSBsZXZlbDInKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMiwgY29sID0gYyhsY29sX3dhdmUwMSwgbGNvbF93YXZlMDFfbGV2ZWwyKSwgaW5zZXQgPSBjKDAuMDUsIDAuMTUpICkKCgoKYGBgCgoKIyMjIEFub21hbHkgdGltZXNlcmllcwoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTJ9CgpwYXIobWZyb3c9IGMoMyw1KSwgbGFzID0gMSwgbWFyID0gYyg0LDQsMSwxKSkKCmZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfc3NwNTg1KSl7CgpsaW5lUGxvdE11bHRpRW5zKHllYXJzID0gc3NweWVhcnMsIGVuczEgPSBnZXQoeXZlY19hbm9tX3NzcDU4NVtpXSksCiAgICAgICAgICAgICAgICAgZW5zMiA9IGdldCh5dmVjX2Fub21fc3NwNTg1W2ldKVtpeF9rZXB0X0FXLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwMSwgY29sMiA9IGxjb2xfd2F2ZTAxX2xldmVsMiwKICAgICAgICAgICAgICAgICB5bGFiID0gc2VsZWN0X3VuaXRzW2ldLCBtYWluID0geXZlY19zc3A1ODVbaV0pCiAgICAgICAgICAgICAgICAgCn0KCnJlc2V0KCkKCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBsZWdlbmQgPSBjKCd3YXZlMDEnLCAnd2F2ZTAxIGxldmVsMicpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyLCBjb2wgPSBjKGxjb2xfd2F2ZTAxLCBsY29sX3dhdmUwMV9sZXZlbDIpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQoKYGBgCgoKIyMgSW5jbHVkZSBiYXJlc29pbCBmcmFjdGlvbiBkYXRhCgpgYGB7cn0KCmxvYWQoJ3RyZWVmcmFjL2dsb2JhbF9mcmFjX2NjaS5SRGF0YScpCgpmcmFjX2NjaSA8LSBjKGdsb2JhbF9mcmFjX2NjaVsxXSArIGdsb2JhbF9mcmFjX2NjaVsyXSwgZ2xvYmFsX2ZyYWNfY2NpWzNdLCBnbG9iYWxfZnJhY19jY2lbNF0sIGdsb2JhbF9mcmFjX2NjaVs1XSwgZ2xvYmFsX2ZyYWNfY2NpWzhdICkKI2ZyYWNfbXYgPC0gYyhzdGFuZGFyZF9tb2Rlcm5fdmFsdWVbJ3RyZWVGcmFjX2xuZF9tZWFuJ10sIHN0YW5kYXJkX21vZGVybl92YWx1ZVsnYzNQZnRGcmFjX2xuZF9tZWFuJ10sICNzdGFuZGFyZF9tb2Rlcm5fdmFsdWVbJ2M0UGZ0RnJhY19sbmRfbWVhbiddLCBzdGFuZGFyZF9tb2Rlcm5fdmFsdWVbJ3NocnViRnJhY19sbmRfbWVhbiddLCBzdGFuZGFyZF9tb2Rlcm5fdmFsdWVbJ2JhcmVzb2lsRnJhY19sbmRfbWVhbiddICApCgoKZnJhY2xhYiA9IGMoJ1RyZWVzJywgJ0MzIGdyYXNzZXMnLCAnQzQgZ3Jhc3NlcycsICdTaHJ1YnMnLCAnQmFyZSBzb2lsJykKCgojIEhhbGYgYW5kIGRvdWJsZSB0aGUgTEMgQ0NJIGRhdGEgdG8gZ2V0IGJvdW5kcyBmb3IgY29uc3RyYWluaW5nIEpVTEVTIEVTLTEuMApmcmFjX2NjaV9tYXggPC0gZnJhY19jY2kgKyAoMC41KmZyYWNfY2NpKQpmcmFjX2NjaV9taW4gPC0gZnJhY19jY2kgLSAoMC41KmZyYWNfY2NpKQoKYGBgCgoKYGBge3J9CgojIE1vZGVybiB2YWx1ZSAKaXhfbXYgPC0gd2hpY2goc3NweWVhcnMgJWluJSAxOTk2OjIwMTUpCgp5dmVjX2NvbnN0cmFpbnRzIDwtIGMoJ25wcF9lbnNfc3NwNTg1X1MzJywgJ25icF9lbnNfc3NwNTg1X1MzJywgJ2NTb2lsX2Vuc19zc3A1ODVfUzMnLCAnY1ZlZ19lbnNfc3NwNTg1X1MzJywnYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMnKQoKIyBNYXRyaXggb2YgY29uc3RyYWludCBvdXRwdXQgbW9kZXJuIHZhbHVlcyAoMTk5NiAtIDIwMTUpCllfY29uc3Rfc3NwNTg1X212IDwtIG1hdHJpeChkYXRhID0gTkEsIG5yb3cgPSBucm93KG5wcF9lbnNfc3NwNTg1X1MzKSwgbmNvbCA9IGxlbmd0aCh5dmVjX2NvbnN0cmFpbnRzKSkKY29sbmFtZXMoWV9jb25zdF9zc3A1ODVfbXYpIDwtIHl2ZWNfY29uc3RyYWludHMKCmZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfY29uc3RyYWludHMpKXsKICAKICBZX3RydW5jIDwtIGdldCh5dmVjX2NvbnN0cmFpbnRzW2ldKVssIGl4X212XQogIFlfdHJ1bmNfbWVhbiA8LSBhcHBseShZX3RydW5jLCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgWV9jb25zdF9zc3A1ODVfbXZbLGldIDwtIFlfdHJ1bmNfbWVhbgp9CgpgYGAKCmBgYHtyfQpjb25zdF9taW5zIDwtIGMoMzUsIDAsIDc1MCwgMzAwLCBmcmFjX2NjaV9taW5bJ2JhcmUgc29pbCddKjEwMCkKY29uc3RfbWF4ZXMgPC0gYyg4MCwgMTAwMDAsIDMwMDAsIDgwMCwgZnJhY19jY2lfbWF4WydiYXJlIHNvaWwnXSoxMDApCgpZX3VuaWYgPC0gWV9jb25zdF9zc3A1ODVfbXYKaXhfa2VwdF9BV0JTIDwtIGV2YWwocGFyc2UodGV4dCA9IGNyZWF0ZUNvbnN0cmFpbnRTdHJpbmcoeXZlYz15dmVjX2NvbnN0cmFpbnRzLCBtaW5zID0gY29uc3RfbWlucywgbWF4ZXMgPSBjb25zdF9tYXhlcykpKQoKYGBgCgoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTJ9Cmxjb2xfd2F2ZTAxIDwtIG1ha2VUcmFuc3BhcmVudCgndG9tYXRvMicsICAxMjApCmxjb2xfd2F2ZTAxX2xldmVsMiA8LSBtYWtlVHJhbnNwYXJlbnQoJ2dvbGQnLCAgMTIwKQpsY29sX3dhdmUwMV9sZXZlbDM8LSBtYWtlVHJhbnNwYXJlbnQoJ2NhZGV0Ymx1ZScsICAyMDApCnN0YW5jb2wgPSAnYmxhY2snCgoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0KCnBhcihtZnJvdz0gYygzLDUpLCBsYXMgPSAxLCBtYXIgPSBjKDQsNCwxLDEpKQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19zc3A1ODUpKXsKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSBzc3B5ZWFycywgZW5zMSA9IGdldCh5dmVjX3NzcDU4NVtpXSksCiAgICAgICAgICAgICAgICAgZW5zMiA9IGdldCh5dmVjX3NzcDU4NVtpXSlbaXhfa2VwdF9BV0JTLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwMSwgY29sMiA9IGxjb2xfd2F2ZTAxX2xldmVsMywKICAgICAgICAgICAgICAgICB5bGFiID0gc2VsZWN0X3VuaXRzW2ldLCBtYWluID0geXZlY19zc3A1ODVbaV0pCiAgICAgICAgICAgICAgICAgCn0KCnJlc2V0KCkKCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBsZWdlbmQgPSBjKCd3YXZlMDEnLCAnd2F2ZTAxIGxldmVsMycpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyLCBjb2wgPSBjKGxjb2xfd2F2ZTAxLCBsY29sX3dhdmUwMV9sZXZlbDMpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQpgYGAKIyMjIEFub21hbHkgdGltZXNlcmllcyBBVyArIGJhcmVzb2lsCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMSkpCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX3NzcDU4NSkpewoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHNzcHllYXJzLCBlbnMxID0gZ2V0KHl2ZWNfYW5vbV9zc3A1ODVbaV0pLAogICAgICAgICAgICAgICAgIGVuczIgPSBnZXQoeXZlY19hbm9tX3NzcDU4NVtpXSlbaXhfa2VwdF9BV0JTLCBdLAogICAgICAgICAgICAgICAgIGNvbDEgPSBsY29sX3dhdmUwMSwgY29sMiA9IGxjb2xfd2F2ZTAxX2xldmVsMywKICAgICAgICAgICAgICAgICB5bGFiID0gc2VsZWN0X3VuaXRzW2ldLCBtYWluID0geV9uYW1lc19zZWxlY3Rfc3NwNTg1W2ldKQogICAgICAgICAgICAgICAgIAp9CgpyZXNldCgpCgpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgbGVnZW5kID0gYygnd2F2ZTAxJywgJ3dhdmUwMSBsZXZlbDMnKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMiwgY29sID0gYyhsY29sX3dhdmUwMSwgbGNvbF93YXZlMDFfbGV2ZWwzKSwgaW5zZXQgPSBjKDAuMDUsIDAuMTUpICkKYGBgCiMjIEVuZC1PZi1DZW50dXJ5IHZhbHVlcyB1bmRlciB2YXJpb3VzIGNvbnN0cmFpbnRzCgpTdGFydGluZyB3aXRoIEFXIGNvbnN0cmFpbnRzIChsZXZlbCAyKSBhbmQgdGhlbiBiYXJlIHNvaWwgKGxldmVsMykKCmBgYHtyfQoKI0VuZCBvZiBDZW50dXJ5Cml4X2VvYyA8LSB3aGljaChzc3B5ZWFycyAlaW4lIDIwODE6MjEwMCkKWV9zc3A1ODVfZW9jIDwtIG1hdHJpeChkYXRhID0gTkEsIG5yb3cgPSBucm93KG5wcF9lbnNfc3NwNTg1X1MzKSwgbmNvbCA9IGxlbmd0aCh5dmVjX3NzcDU4NSkpCmNvbG5hbWVzKFlfc3NwNTg1X2VvYykgPC0geXZlY19zc3A1ODUKCmZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfc3NwNTg1KSl7CiAgCiAgWV90cnVuYyA8LSBnZXQoeXZlY19zc3A1ODVbaV0pWywgaXhfZW9jXQogIFlfdHJ1bmNfbWVhbiA8LSBhcHBseShZX3RydW5jLCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgWV9zc3A1ODVfZW9jWyxpXSA8LSBZX3RydW5jX21lYW4KfQpgYGAKCiMjIyBIaXN0b2dyYW1zIG9mIGVuZC1vZi1jZW50dXJ5IGFic29sdXRlIHZhbHVlcwoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KCgpoY29sX3dhdmUwMSA8LSBtYWtlVHJhbnNwYXJlbnQoJ2ZpcmVicmljaycsIDE1MCkKaGNvbF93YXZlMDFfbGV2ZWwyIDwtIG1ha2VUcmFuc3BhcmVudCgnZ29sZCcsMjU1KQpoY29sX3dhdmUwMV9sZXZlbDMgPC0gbWFrZVRyYW5zcGFyZW50KCdjYWRldGJsdWUnLDI1NSkKCgpwYXIobWZyb3cgPSBjKDMsNSksIGZnID0gJ2dyZXknKQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19zc3A1ODUpKXsKICAKICBoMSA8LSBoaXN0KFlfc3NwNTg1X2VvY1ssaV0sIG1haW4gPSB5X25hbWVzX3NlbGVjdF9zc3A1ODVbaV0sIHhsYWIgPSBzZWxlY3RfdW5pdHNbaV0sIGNvbCA9IGhjb2xfd2F2ZTAxLCB5bGltID0gYygwLDIyNSkpCiAgCiAgaGlzdChZX3NzcDU4NV9lb2NbaXhfa2VwdF9BVyxpXSwgY29sID0gaGNvbF93YXZlMDFfbGV2ZWwyLCBhZGQgPSBUUlVFLCBicmVha3MgPSBoMSRicmVha3MpCiAgaGlzdChZX3NzcDU4NV9lb2NbaXhfa2VwdF9BV0JTLGldLCBjb2wgPSBoY29sX3dhdmUwMV9sZXZlbDMsIGFkZCA9IFRSVUUsIGJyZWFrcyA9IGgxJGJyZWFrcykKfQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMScsICAnd2F2ZTAxIGxldmVsMicsICd3YXZlMDEgbGV2ZWwzJyksICBmaWxsPSBjKGhjb2xfd2F2ZTAxLGhjb2xfd2F2ZTAxX2xldmVsMiwgaGNvbF93YXZlMDFfbGV2ZWwzKSwgaW5zZXQgPSBjKDAuMDUsIDAuMTUpICkKCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOH0KCnBhcihtZnJvdyA9IGMoMyw1KSwgZmcgPSAnZ3JleScpCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX3NzcDU4NSkpewogIAogIGgxIDwtIGhpc3QoWV9zc3A1ODVfZW9jW2l4X2tlcHRfQVcsaV0sIG1haW4gPSB5X25hbWVzX3NlbGVjdF9zc3A1ODVbaV0sIHhsYWIgPSBzZWxlY3RfdW5pdHNbaV0sIGNvbCA9IGhjb2xfd2F2ZTAxX2xldmVsMiwgeWxpbSA9IGMoMCw4MCkpCiAgaGlzdChZX3NzcDU4NV9lb2NbaXhfa2VwdF9BV0JTLGldLCBjb2wgPSBoY29sX3dhdmUwMV9sZXZlbDMsIGFkZCA9IFRSVUUsIGJyZWFrcyA9IGgxJGJyZWFrcykKfQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoICd3YXZlMDEgbGV2ZWwyJywgJ3dhdmUwMSBsZXZlbDMnKSwgIGZpbGw9IGMoaGNvbF93YXZlMDFfbGV2ZWwyLCBoY29sX3dhdmUwMV9sZXZlbDMpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQoKCmBgYAoKIyMjIEhpc3RvZ3JhbXMgb2YgZW5kLW9mLWNlbnR1cnkgY2hhbmdlcyAoYW5vbWFseSBmcm9tIHByZWluZHVzdHJpYWwpCgpgYGB7cn0KCiNFbmQgb2YgQ2VudHVyeQppeF9lb2MgPC0gd2hpY2goc3NweWVhcnMgJWluJSAyMDgxOjIxMDApCllfc3NwNTg1X2Fub21fZW9jIDwtIG1hdHJpeChkYXRhID0gTkEsIG5yb3cgPSBucm93KG5wcF9lbnNfYW5vbV9zc3A1ODVfUzMpLCBuY29sID0gbGVuZ3RoKHl2ZWNfc3NwNTg1KSkKY29sbmFtZXMoWV9zc3A1ODVfYW5vbV9lb2MpIDwtIHl2ZWNfYW5vbV9zc3A1ODUKCmZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfYW5vbV9zc3A1ODUpKXsKICAKICBZX3RydW5jIDwtIGdldCh5dmVjX2Fub21fc3NwNTg1W2ldKVssIGl4X2VvY10KICBZX3RydW5jX21lYW4gPC0gYXBwbHkoWV90cnVuYywgMSwgbWVhbiwgbmEucm0gPSBUUlVFKQogIFlfc3NwNTg1X2Fub21fZW9jWyxpXSA8LSBZX3RydW5jX21lYW4KfQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDh9CgoKI2hjb2xfd2F2ZTAxIDwtIG1ha2VUcmFuc3BhcmVudCgnZmlyZWJyaWNrJywgMTUwKQojaGNvbF93YXZlMDFfbGV2ZWwyIDwtIG1ha2VUcmFuc3BhcmVudCgnZ29sZCcsMjU1KQojaGNvbF93YXZlMDFfbGV2ZWwzIDwtIG1ha2VUcmFuc3BhcmVudCgnY2FkZXRibHVlJywyNTUpCgpwYXIobWZyb3cgPSBjKDMsNSksIGZnID0gJ2dyZXknKQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19hbm9tX3NzcDU4NSkpewogIAogIGgxIDwtIGhpc3QoWV9zc3A1ODVfYW5vbV9lb2NbLGldLCBtYWluID0geV9uYW1lc19zZWxlY3Rfc3NwNTg1W2ldLCB4bGFiID0gc2VsZWN0X3VuaXRzW2ldLCBjb2wgPSBoY29sX3dhdmUwMSwgeWxpbSA9IGMoMCwyMjUpKQogIAogIGhpc3QoWV9zc3A1ODVfYW5vbV9lb2NbaXhfa2VwdF9BVyxpXSwgY29sID0gaGNvbF93YXZlMDFfbGV2ZWwyLCBhZGQgPSBUUlVFLCBicmVha3MgPSBoMSRicmVha3MpCiAgaGlzdChZX3NzcDU4NV9hbm9tX2VvY1tpeF9rZXB0X0FXQlMsaV0sIGNvbCA9IGhjb2xfd2F2ZTAxX2xldmVsMywgYWRkID0gVFJVRSwgYnJlYWtzID0gaDEkYnJlYWtzKQogIAogIGFibGluZSh2ID0gMCkKfQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMScsICAnd2F2ZTAxIGxldmVsMicsICd3YXZlMDEgbGV2ZWwzJyksICBmaWxsPSBjKGhjb2xfd2F2ZTAxLGhjb2xfd2F2ZTAxX2xldmVsMiwgaGNvbF93YXZlMDFfbGV2ZWwzKSwgaW5zZXQgPSBjKDAuMDUsIDAuMTUpICkKCmBgYApgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSA4fQoKCiNoY29sX3dhdmUwMSA8LSBtYWtlVHJhbnNwYXJlbnQoJ2ZpcmVicmljaycsIDE1MCkKI2hjb2xfd2F2ZTAxX2xldmVsMiA8LSBtYWtlVHJhbnNwYXJlbnQoJ2dvbGQnLDI1NSkKI2hjb2xfd2F2ZTAxX2xldmVsMyA8LSBtYWtlVHJhbnNwYXJlbnQoJ2NhZGV0Ymx1ZScsMjU1KQoKcGFyKG1mcm93ID0gYygzLDUpLCBmZyA9ICdncmV5JykKCmZvcihpIGluIDE6bGVuZ3RoKHl2ZWNfYW5vbV9zc3A1ODUpKXsKICAKIGgxIDwtICBoaXN0KFlfc3NwNTg1X2Fub21fZW9jW2l4X2tlcHRfQVcsaV0sICBtYWluID0geV9uYW1lc19zZWxlY3Rfc3NwNTg1W2ldLCB4bGFiID0gc2VsZWN0X3VuaXRzW2ldLGNvbCA9IGhjb2xfd2F2ZTAxX2xldmVsMiwgeWxpbSA9IGMoMCw4MCkpCiAgaGlzdChZX3NzcDU4NV9hbm9tX2VvY1tpeF9rZXB0X0FXQlMsaV0sIGNvbCA9IGhjb2xfd2F2ZTAxX2xldmVsMywgYWRkID0gVFJVRSwgYnJlYWtzID0gaDEkYnJlYWtzKQogIAogIGFibGluZSh2ID0gMCkKfQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMSBsZXZlbDInLCAnd2F2ZTAxIGxldmVsMycpLCAgZmlsbD0gYyhoY29sX3dhdmUwMV9sZXZlbDIsIGhjb2xfd2F2ZTAxX2xldmVsMyksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgpgYGAKCiMjIEFkZGluZyBjdW11bGF0aXZlIE5CUCBhcyBhIGNvbnN0cmFpbnQKCmBgYHtyfQp0ZXN0IDwtIG1hdHJpeCgxOjksIG5yb3cgPSAzLCBieXJvdyA9IFRSVUUpCnRlc3QKCnQoYXBwbHkodGVzdCwgMSwgRlVOID0gY3Vtc3VtKSkKYGBgCgpgYGB7cn0KCmNuYnBfZW5zX3NzcDU4NV9TMyA8LSAgdChhcHBseShuYnBfZW5zX3NzcDU4NV9TMywgMSwgRlVOID0gY3Vtc3VtKSkKCmBgYAoKCmBgYHtyfQoKIyBNb2Rlcm4gdmFsdWUgCiMgaXhfbXYgPC0gd2hpY2goc3NweWVhcnMgJWluJSAxOTk2OjIwMTUpCiMgCiMgeXZlY19jb25zdHJhaW50cyA8LSBjKCducHBfZW5zX3NzcDU4NV9TMycsICduYnBfZW5zX3NzcDU4NV9TMycsICdjU29pbF9lbnNfc3NwNTg1X1MzJywgJ2NWZWdfZW5zX3NzcDU4NV9TMycsJ2JhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzJykKIyAKIyAjIE1hdHJpeCBvZiBjb25zdHJhaW50IG91dHB1dCBtb2Rlcm4gdmFsdWVzICgxOTk2IC0gMjAxNSkKIyBZX2NvbnN0X3NzcDU4NV9tdiA8LSBtYXRyaXgoZGF0YSA9IE5BLCBucm93ID0gbnJvdyhucHBfZW5zX3NzcDU4NV9TMyksIG5jb2wgPSBsZW5ndGgoeXZlY19jb25zdHJhaW50cykpCiMgY29sbmFtZXMoWV9jb25zdF9zc3A1ODVfbXYpIDwtIHl2ZWNfY29uc3RyYWludHMKIyAKIyBmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX2NvbnN0cmFpbnRzKSl7CiMgICAKIyAgIFlfdHJ1bmMgPC0gZ2V0KHl2ZWNfY29uc3RyYWludHNbaV0pWywgaXhfbXZdCiMgICBZX3RydW5jX21lYW4gPC0gYXBwbHkoWV90cnVuYywgMSwgbWVhbiwgbmEucm0gPSBUUlVFKQojICAgWV9jb25zdF9zc3A1ODVfbXZbLGldIDwtIFlfdHJ1bmNfbWVhbgojIH0KCmBgYAoKCmBgYHtyfQojIENhbGN1bGF0ZSBNb2Rlcm4gdmFsdWUgQ05CUAoKaXhfMjAxNCA8LSB3aGljaChzc3B5ZWFycyA9PSAyMDE0KQoKY25icF9lbnNfc3NwNTg1X1MzX212IDwtIGNuYnBfZW5zX3NzcDU4NV9TM1ssIGl4XzIwMTRdCgpicmVha3MgPC0gc2VxKGZyb20gPSAtMTAwLCB0byA9IDM1MCwgYnkgPSAyNSkKaGlzdChjbmJwX2Vuc19zc3A1ODVfUzNfbXYsIG1haW4gPSAiY3VtdWxhdGl2ZSBOQlAgc2luY2UgMTg1MCBhdCAyMDE0IiwgY29sID0gaGNvbF93YXZlMDEsCiAgICAgeGxhYiA9ICdDdW11bGF0aXZlIE5CUCBzaW5jZSAxODUwIChHdEMpJywgYnJlYWtzID0gYnJlYWtzKQpoaXN0KGNuYnBfZW5zX3NzcDU4NV9TM19tdltpeF9rZXB0X0FXXSwgYWRkID0gVFJVRSwgY29sID0gaGNvbF93YXZlMDFfbGV2ZWwyLCBicmVha3MgPSBicmVha3MpCmhpc3QoY25icF9lbnNfc3NwNTg1X1MzX212W2l4X2tlcHRfQVdCU10sIGFkZCA9IFRSVUUsIGNvbCA9IGhjb2xfd2F2ZTAxX2xldmVsMywgYnJlYWtzID0gYnJlYWtzKQogICAgIApyZXNldCgpCgpsZWdlbmQoJ3RvcHJpZ2h0JywgbGVnZW5kID0gYygnd2F2ZTAxJywgICd3YXZlMDEgbGV2ZWwyJywgJ3dhdmUwMSBsZXZlbDMnKSwgIGZpbGw9IGMoaGNvbF93YXZlMDEsaGNvbF93YXZlMDFfbGV2ZWwyLCBoY29sX3dhdmUwMV9sZXZlbDMpLCBpbnNldCA9IGMoMC4yLCAwLjIpICkKCmBgYAoKCmBgYHtyfQpjb25zdF9taW5zIDwtIGMoMzUsIDAsIDc1MCwgMzAwLCBmcmFjX2NjaV9taW5bJ2JhcmUgc29pbCddKjEwMCkKY29uc3RfbWF4ZXMgPC0gYyg4MCwgMTAwMDAsIDMwMDAsIDgwMCwgZnJhY19jY2lfbWF4WydiYXJlIHNvaWwnXSoxMDApCgpZX3VuaWYgPC0gWV9jb25zdF9zc3A1ODVfbXYKaXhfa2VwdF9BV0JTIDwtIGV2YWwocGFyc2UodGV4dCA9IGNyZWF0ZUNvbnN0cmFpbnRTdHJpbmcoeXZlYz15dmVjX2NvbnN0cmFpbnRzLCBtaW5zID0gY29uc3RfbWlucywgbWF4ZXMgPSBjb25zdF9tYXhlcykpKQoKYGBgCgoKYGBge3J9Cgpjb25zdF9taW5zX2xldmVsNCA8LSBjKDM1LCAwLCA3NTAsIDMwMCwgZnJhY19jY2lfbWluWydiYXJlIHNvaWwnXSoxMDAsIC00MCkKY29uc3RfbWF4ZXNfbGV2ZWw0IDwtIGMoODAsIDEwMDAwLCAzMDAwLCA4MDAsIGZyYWNfY2NpX21heFsnYmFyZSBzb2lsJ10qMTAwLCA0MCkKCllfdW5pZiA8LSBjYmluZChZX2NvbnN0X3NzcDU4NV9tdiwgY25icF9lbnNfc3NwNTg1X1MzX212KQpsZXZlbDRfY29uc3RyYWludHMgPC0gYygnbnBwX2Vuc19zc3A1ODVfUzMnLCAnbmJwX2Vuc19zc3A1ODVfUzMnLCAnY1NvaWxfZW5zX3NzcDU4NV9TMycsICdjVmVnX2Vuc19zc3A1ODVfUzMnLCAnYmFyZXNvaWxGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzMnLCAnY25icF9lbnNfc3NwNTg1X1MzX212JykKaXhfa2VwdF9sZXZlbDQgPC0gZXZhbChwYXJzZSh0ZXh0ID0gY3JlYXRlQ29uc3RyYWludFN0cmluZyh5dmVjPWxldmVsNF9jb25zdHJhaW50cywgbWlucyA9IGNvbnN0X21pbnNfbGV2ZWw0LCBtYXhlcyA9IGNvbnN0X21heGVzX2xldmVsNCkpKQoKIyBoYWNrIGhlcmUsIG5lZWQgdG8gc29ydCBjcmVhdGVDb25zdHJhaW50c1N0cmluZwpZX212IDwtIFlfdW5pZgoKYGBgCgojIyMgQ3VtdWxhdGl2ZSBOQlAgaW4gdGhlIGxldmVsIDQgY29uc3RyYWluZWQgZW5zZW1ibGUKCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gMTB9CgptYXRwbG90KHNzcHllYXJzLCB0KGNuYnBfZW5zX3NzcDU4NV9TMyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChoY29sX3dhdmUwMSwgMTAwKSwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnQ3VtdWxhdGl2ZSBOQlAnLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nLCBsd2QgPSAyKQoKbWF0bGluZXMoc3NweWVhcnMsIHQoY25icF9lbnNfc3NwNTg1X1MzW2l4X2tlcHRfQVcsIF0pLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoaGNvbF93YXZlMDFfbGV2ZWwyLCAyMDApLCBsd2QgPSAyKQptYXRsaW5lcyhzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzNbaXhfa2VwdF9BV0JTLCBdKSxsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoaGNvbF93YXZlMDFfbGV2ZWwzLCAyMDApLCBsd2QgPSAyKQptYXRsaW5lcyhzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzNbaXhfa2VwdF9sZXZlbDQsIF0pLGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCAyMDApLCBsd2QgPSAyKQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21sZWZ0JywgbGVnZW5kID0gYygnd2F2ZTAxJywgICd3YXZlMDEgbGV2ZWwyJywgJ3dhdmUwMSBsZXZlbDMnLCAnd2F2ZTAxIGxldmVsNCcpLCAgY29sID0gYyhoY29sX3dhdmUwMSxoY29sX3dhdmUwMV9sZXZlbDIsIGhjb2xfd2F2ZTAxX2xldmVsMywgJ2JsYWNrJyksIGluc2V0ID0gYygwLjIsIDAuMiksIGx0eSA9ICdzb2xpZCcgKQoKYGBgCgoKYGBge3J9CihsZW5ndGgoaXhfa2VwdF9BVykgLyA1MDApICogMTAwCihsZW5ndGgoaXhfa2VwdF9BV0JTKSAvNTAwKSAqIDEwMAoobGVuZ3RoKGl4X2tlcHRfbGV2ZWw0KSAvIDUwMCkgKiAxMDAgCmBgYAoKIyMjIFRoZSBjYXJib24gY3ljbGUgaW4gbGV2ZWwgNCBjb25zdHJhaW5lZCBlbnNlbWJsZSAKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMSkpCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX3NzcDU4NSkpewoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHNzcHllYXJzLCBlbnMxID0gZ2V0KHl2ZWNfc3NwNTg1W2ldKSwKICAgICAgICAgICAgICAgICBlbnMyID0gZ2V0KHl2ZWNfc3NwNTg1W2ldKVtpeF9rZXB0X2xldmVsNCwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMDEsIGNvbDIgPSAnYmxhY2snLAogICAgICAgICAgICAgICAgIHlsYWIgPSBzZWxlY3RfdW5pdHNbaV0sIG1haW4gPSB5dmVjX3NzcDU4NVtpXSkKICAgICAgICAgICAgICAgICAKfQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMScsICd3YXZlMDEgbGV2ZWw0JyksIGx0eSA9ICdzb2xpZCcsIGx3ZCA9IDIsIGNvbCA9IGMobGNvbF93YXZlMDEsICdibGFjaycpLCBpbnNldCA9IGMoMC4wNSwgMC4xNSkgKQoKCgoKCmBgYAoKYGBge3J9CgojIExvYWQgdXAgdGhlIGRhdGEKbGhzX2kgPSByZWFkLnRhYmxlKCdkYXRhL2xoc191LWFvNzMyLnR4dCcsIGhlYWRlciA9IFRSVUUpCmxoc19paSA9IHJlYWQudGFibGUoJ2RhdGEvbGhzX3UtYW83MzJhLnR4dCcsIGhlYWRlciA9IFRSVUUpCgp0b3BsZXZlbF9peCA9IDE6NDk5CgoKIyBJICp0aGluayogdGhlIGxhc3QgZW5zZW1ibGUgbWVtYmVyICg1MDEpIGlzIHRoZSBzdGFuZGFyZCBzZXQgb2YgcGFyYW1ldGVycwpudHJhaW5fd2F2ZTAxIDwtIDUwMAoKIyBMb2FkIGlucHV0IG1hdHJpY2VzIGFuZCBiaW5kIHdpdGggd2F2ZTAwIGlucHV0cwpsaHNfd2F2ZTAxIDwtIHJlYWQudGFibGUoICdkYXRhL2xoc19leGFtcGxlLnR4dCcsIGhlYWRlciA9IFRSVUUpCgpsaHNfd2F2ZTAxX3N0YW5kYXJkIDwtIHJiaW5kKGxoc193YXZlMDEsIGMocmVwKDEsIG5jb2wobGhzX3dhdmUwMSkpKSkKClhfd2F2ZTAxX3N0YW5kYXJkID0gbm9ybWFsaXplKGxoc193YXZlMDFfc3RhbmRhcmQsIHdydCA9IHJiaW5kKGxoc19pLCBsaHNfaWksIGxoc193YXZlMDEpKQpjb2xuYW1lcyhYX3dhdmUwMV9zdGFuZGFyZCkgPSBjb2xuYW1lcyhsaHNfd2F2ZTAxKQoKI3N0YW5kYXJkIG1lbWJlciBhdCB0aGUgZW5kCiNsaHNfYWxsIDwtIHJiaW5kKGxoc19pLCBsaHNfaWksIGxoc193YXZlMDEsIGMocmVwKDEsIG5jb2wobGhzX2kpKSkpCgojIE1hdGNoIHRoZSA0MDAgb3V0cHV0cyB3ZSdyZSB1c2luZyBpbiB0aGUgdHJhaW5pbmcgZGF0YQojWF93YXZlMDFfdHJhaW4gPC0gWF93YXZlMDFbMTpudHJhaW5fd2F2ZTAxLCBdCgpgYGAKCiMjIHRoZSBpbXBhY3Qgb2YgY29uc3RyYWludHMgb24gaW5wdXQgc3BhY2UgCgpGaXJzdCwgdGhlIGVudGlyZSB3YXZlMDEgZW5zZW1ibGUuIEhhcmQgYm91bmRhcmllcyB0YWtlbiBvdXQgZWFybHkgYXJlIHZpc2libGUgaGVyZQoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTJ9CgoKcGFpcnMoWF93YXZlMDFfc3RhbmRhcmQsIGdhcCA9IDAsIGxvd2VyLnBhbmVsID0gTlVMTCwgY2V4ID0gMC42LCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ2JsYWNrJywgMTAwKSwgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSkKCmBgYAojIyMgTGV2ZWwgNCBjb25zdHJhaW5lZCBpbnB1dCBzcGFjZQoKSlVMRVMgc3RhbmRhcmQgbWVtYmVyIGluIHJlZC4KCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTIsIGZpZy53aWR0aD0gMTIgfQpjb2xuYW1lcyhYX3dhdmUwMV9zdGFuZGFyZCkgPC0gMTozMgpwYWlycyhYX3dhdmUwMV9zdGFuZGFyZFtpeF9rZXB0X2xldmVsNCxdLAogICAgICBjb2wgPSBjKHJlcChtYWtlVHJhbnNwYXJlbnQoJ2JsYWNrJywgMTUwKSwgbGVuZ3RoKGl4X2tlcHRfbGV2ZWw0KS0xKSwgJ3JlZCcpLAogICAgICBjZXggPSBjKHJlcCgwLjgsIGxlbmd0aChpeF9rZXB0X2xldmVsNCktMSksIDEpLAogICAgICBwY2ggPSBjKHJlcCgyMSwgbGVuZ3RoKGl4X2tlcHRfbGV2ZWw0KS0xKSwgMTkpLAogICAgICB4bGltID0gYygwLDEpLCB5bGltID0gYygwLDEpLAogICAgICBnYXAgPSAwLCAKICAgICAgbG93ZXIucGFuZWwgPSBOVUxMCikKCnJlc2V0KCkKbGVnZW5kKCdsZWZ0JywgbGVnZW5kID0gcGFzdGUoMTozMiwgY29sbmFtZXMobGhzX2kpKSwgY2V4ID0gMSwgYnR5ID0gJ24nKQoKCmBgYAoKYGBge3J9CmNvbnN0X21pbnMgPC0gYygzNSwgMCwgNzUwLCAzMDAsIGZyYWNfY2NpX21pblsnYmFyZSBzb2lsJ10qMTAwKQpjb25zdF9tYXhlcyA8LSBjKDgwLCAxMDAwMCwgMzAwMCwgODAwLCBmcmFjX2NjaV9tYXhbJ2JhcmUgc29pbCddKjEwMCkKCllfdW5pZiA8LSBZX2NvbnN0X3NzcDU4NV9tdgppeF9rZXB0X0FXQlMgPC0gZXZhbChwYXJzZSh0ZXh0ID0gY3JlYXRlQ29uc3RyYWludFN0cmluZyh5dmVjPXl2ZWNfY29uc3RyYWludHMsIG1pbnMgPSBjb25zdF9taW5zLCBtYXhlcyA9IGNvbnN0X21heGVzKSkpCgpgYGAKCgpgYGB7cn0KCnRyZWVGcmFjX2NjaV9taW4gPC0gKGdsb2JhbF9mcmFjX2NjaVsnYnJvYWRsZWFmIHRyZWVzJ10gKyBnbG9iYWxfZnJhY19jY2lbJ25lZWRsZWxlYWYgdHJlZXMnXSkgKiAxMDAgKiAwLjUKdHJlZUZyYWNfY2NpX21heCA8LSAoZ2xvYmFsX2ZyYWNfY2NpWydicm9hZGxlYWYgdHJlZXMnXSArIGdsb2JhbF9mcmFjX2NjaVsnbmVlZGxlbGVhZiB0cmVlcyddKSAqIDEwMCAqIDIKCmNvbnN0X21pbnNfbGV2ZWw1IDwtIGMoMzUsIDAsIDc1MCwgMzAwLCBmcmFjX2NjaV9taW5bJ2JhcmUgc29pbCddKjEwMCwgLTUwLCB0cmVlRnJhY19jY2lfbWluKQpjb25zdF9tYXhlc19sZXZlbDUgPC0gYyg4MCwgMTAwMDAsIDMwMDAsIDgwMCwgZnJhY19jY2lfbWF4WydiYXJlIHNvaWwnXSoxMDAsIDUwLCB0cmVlRnJhY19jY2lfbWF4ICkKCgp0cmVlRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzX3RydW5jIDwtIHRyZWVGcmFjX2xuZF9tZWFuX2Vuc19zc3A1ODVfUzNbLCBpeF9tdl0KdHJlZUZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TM19tdiA8LSBhcHBseSh0cmVlRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzX3RydW5jLCAxLCBtZWFuLCBuYS5ybSA9IFRSVUUpCiAgCgpZX3VuaWYgPC0gY2JpbmQoWV9jb25zdF9zc3A1ODVfbXYsIGNuYnBfZW5zX3NzcDU4NV9TM19tdiwgdHJlZUZyYWNfbG5kX21lYW5fZW5zX3NzcDU4NV9TM19tdikKbGV2ZWw1X2NvbnN0cmFpbnRzIDwtIGMoJ25wcF9lbnNfc3NwNTg1X1MzJywgJ25icF9lbnNfc3NwNTg1X1MzJywgJ2NTb2lsX2Vuc19zc3A1ODVfUzMnLCAnY1ZlZ19lbnNfc3NwNTg1X1MzJywgJ2JhcmVzb2lsRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzJywgJ2NuYnBfZW5zX3NzcDU4NV9TM19tdicsICd0cmVlRnJhY19sbmRfbWVhbl9lbnNfc3NwNTg1X1MzX212JykKaXhfa2VwdF9sZXZlbDUgPC0gZXZhbChwYXJzZSh0ZXh0ID0gY3JlYXRlQ29uc3RyYWludFN0cmluZyh5dmVjPWxldmVsNV9jb25zdHJhaW50cywgbWlucyA9IGNvbnN0X21pbnNfbGV2ZWw1LCBtYXhlcyA9IGNvbnN0X21heGVzX2xldmVsNSkpKQoKIyBoYWNrIGhlcmUsIG5lZWQgdG8gc29ydCBjcmVhdGVDb25zdHJhaW50c1N0cmluZwpZX212NSA8LSBZX3VuaWYKCmBgYAoKCgpgYGB7ciwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAxMn0KCnBhcihtZnJvdz0gYygzLDUpLCBsYXMgPSAxLCBtYXIgPSBjKDQsNCwxLDEpKQoKZm9yKGkgaW4gMTpsZW5ndGgoeXZlY19zc3A1ODUpKXsKCmxpbmVQbG90TXVsdGlFbnMoeWVhcnMgPSBzc3B5ZWFycywgZW5zMSA9IGdldCh5dmVjX3NzcDU4NVtpXSksCiAgICAgICAgICAgICAgICAgZW5zMiA9IGdldCh5dmVjX3NzcDU4NVtpXSlbaXhfa2VwdF9sZXZlbDUsIF0sCiAgICAgICAgICAgICAgICAgY29sMSA9IGxjb2xfd2F2ZTAxLCBjb2wyID0gJ2dyZWVuJywKICAgICAgICAgICAgICAgICB5bGFiID0gc2VsZWN0X3VuaXRzW2ldLCBtYWluID0geXZlY19zc3A1ODVbaV0pCiAgICAgICAgICAgICAgICAgCn0KCnJlc2V0KCkKCmxlZ2VuZCgnYm90dG9tcmlnaHQnLCBsZWdlbmQgPSBjKCd3YXZlMDEnLCAnd2F2ZTAxIGxldmVsNScpLCBsdHkgPSAnc29saWQnLCBsd2QgPSAyLCBjb2wgPSBjKGxjb2xfd2F2ZTAxLCAnZ3JlZW4nKSwgaW5zZXQgPSBjKDAuMDUsIDAuMTUpICkKCgoKYGBgCmBgYHtyLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gMTB9CgptYXRwbG90KHNzcHllYXJzLCB0KGNuYnBfZW5zX3NzcDU4NV9TMyksIHR5cGUgPSAnbCcsIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChoY29sX3dhdmUwMSwgMjUwKSwKICAgICAgICB5bGFiID0gJ0d0QycsIG1haW4gPSAnQ3VtdWxhdGl2ZSBOQlAnLCB4bGFiID0gJycsCiAgICAgICAgYnR5ID0gJ24nLCBsd2QgPSAyKQoKbWF0bGluZXMoc3NweWVhcnMsIHQoY25icF9lbnNfc3NwNTg1X1MzW2l4X2tlcHRfQVcsIF0pLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoaGNvbF93YXZlMDFfbGV2ZWwyLCAyNTApLCBsd2QgPSAyKQptYXRsaW5lcyhzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzNbaXhfa2VwdF9BV0JTLCBdKSxsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoaGNvbF93YXZlMDFfbGV2ZWwzLCAyNTApLCBsd2QgPSAyKQptYXRsaW5lcyhzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzNbaXhfa2VwdF9sZXZlbDQsIF0pLGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmxhY2snLCAyNTApLCBsd2QgPSAyKQptYXRsaW5lcyhzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzNbaXhfa2VwdF9sZXZlbDUsIF0pLGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnZ3JlZW4nLCAyNTApLCBsd2QgPSAyKQpsaW5lcyhzc3B5ZWFycywgY25icF9lbnNfc3NwNTg1X1MzWzUwMSwgXSxsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoJ2JsdWUnLCAyNTApLCBsd2QgPSAyKQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21sZWZ0JywgbGVnZW5kID0gYygnd2F2ZTAxJywgICd3YXZlMDEgbGV2ZWwyJywgJ3dhdmUwMSBsZXZlbDMnLCAnd2F2ZTAxIGxldmVsNCcsICd3YXZlMDEgbGV2ZWw1JywgJ1N0YW5kYXJkJyksICBjb2wgPSBjKGhjb2xfd2F2ZTAxLGhjb2xfd2F2ZTAxX2xldmVsMiwgaGNvbF93YXZlMDFfbGV2ZWwzLCAnYmxhY2snLCAnZ3JlZW4nLCAnYmx1ZScpLCBpbnNldCA9IGMoMC4yLCAwLjIpLCBsdHkgPSAnc29saWQnICwgbHdkID0gMikKCmBgYAoKCiMjIHJhbmsgdGhlIGxldmVsNSBtZW1iZXJzIGJ5IHRoZWlyIDIxMDAgdmFsdWVzCgpgYGB7cn0KCmNuYnBfZW5zX3NzcDU4NV9TM1s1MDEsIG5jb2woY25icF9lbnNfc3NwNTg1X1MzKV0KIyBTdGFuZGFyZCBtZW1iZXIgY25icCBpcyAxMzkuNQoKY25icF9lbnNfc3NwNTg1X2VvY19sZXZlbDUgPC0gY25icF9lbnNfc3NwNTg1X1MzWyBpeF9rZXB0X2xldmVsNSwgbmNvbChjbmJwX2Vuc19zc3A1ODVfUzMpIF0KCgpsZXZlbDVfc29ydCA8LSBzb3J0KGNuYnBfZW5zX3NzcDU4NV9lb2NfbGV2ZWw1LCBpbmRleC5yZXR1cm4gPSBUUlVFKQoKaXhfdGVzdF9zZXQgPC0gaXhfa2VwdF9sZXZlbDVbYyhoZWFkKGxldmVsNV9zb3J0JGl4LDEpLCAxOSAsMzEsIHRhaWwobGV2ZWw1X3NvcnQkaXgsMSkpXQoKY25icF9lbnNfc3NwNTg1X1MzW2l4X3Rlc3Rfc2V0LCBuY29sKGNuYnBfZW5zX3NzcDU4NV9TMykgXQoKIyBtYXggaXMgMjUwCiMgbWluIGlzIC0xNzUKIyBzdGFuZGFyZCBpcyAxMzkuNQojIGNvdWxkIGNob29zZSAtIDYgb3IgMy4zIGFzIHNvbWV0aGluZyBjbG9zZSB0byB6ZXJvCgoKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDEwfQoKbWF0cGxvdChzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzMpLCB0eXBlID0gJ2wnLCBsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoaGNvbF93YXZlMDEsIDI1MCksCiAgICAgICAgeWxhYiA9ICdHdEMnLCBtYWluID0gJ0N1bXVsYXRpdmUgTkJQJywgeGxhYiA9ICcnLAogICAgICAgIGJ0eSA9ICduJywgbHdkID0gMikKCiNtYXRsaW5lcyhzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzNbaXhfa2VwdF9BVywgXSksIGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudChoY29sX3dhdmUwMV9sZXZlbDIsIDI1MCksIGx3ZCA9IDIpCiNtYXRsaW5lcyhzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzNbaXhfa2VwdF9BV0JTLCBdKSxsdHkgPSAnc29saWQnLCBjb2wgPSBtYWtlVHJhbnNwYXJlbnQoaGNvbF93YXZlMDFfbGV2ZWwzLCAyNTApLCBsd2QgPSAyKQptYXRsaW5lcyhzc3B5ZWFycywgdChjbmJwX2Vuc19zc3A1ODVfUzNbaXhfa2VwdF9sZXZlbDUsIF0pLGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnZ3JlZW4nLCA5MCksIGx3ZCA9IDIpCm1hdGxpbmVzKHNzcHllYXJzLCB0KGNuYnBfZW5zX3NzcDU4NV9TM1tpeF90ZXN0X3NldCwgXSksbHR5ID0gJ3NvbGlkJywgY29sID0gbWFrZVRyYW5zcGFyZW50KCdza3libHVlMicsIDI1NSksIGx3ZCA9IDIpCmxpbmVzKHNzcHllYXJzLCBjbmJwX2Vuc19zc3A1ODVfUzNbNTAxLCBdLGx0eSA9ICdzb2xpZCcsIGNvbCA9IG1ha2VUcmFuc3BhcmVudCgnYmx1ZScsIDI1MCksIGx3ZCA9IDIpCgpyZXNldCgpCgpsZWdlbmQoJ2JvdHRvbWxlZnQnLCBsZWdlbmQgPSBjKCd3YXZlMDEnLCAgJ3dhdmUwMSBsZXZlbDInLCAnd2F2ZTAxIGxldmVsMycsICd3YXZlMDEgbGV2ZWw0JywgJ3dhdmUwMSBsZXZlbDUnLCAnU3RhbmRhcmQnKSwgIGNvbCA9IGMoaGNvbF93YXZlMDEsaGNvbF93YXZlMDFfbGV2ZWwyLCBoY29sX3dhdmUwMV9sZXZlbDMsICdibGFjaycsICdncmVlbicsICdibHVlJyksIGluc2V0ID0gYygwLjIsIDAuMiksIGx0eSA9ICdzb2xpZCcgLCBsd2QgPSAyKQoKYGBgCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEyfQoKcGFyKG1mcm93PSBjKDMsNSksIGxhcyA9IDEsIG1hciA9IGMoNCw0LDEsMSkpCgpmb3IoaSBpbiAxOmxlbmd0aCh5dmVjX3NzcDU4NSkpewoKbGluZVBsb3RNdWx0aUVucyh5ZWFycyA9IHNzcHllYXJzLCBlbnMxID0gZ2V0KHl2ZWNfc3NwNTg1W2ldKSwKICAgICAgICAgICAgICAgICBlbnMyID0gZ2V0KHl2ZWNfc3NwNTg1W2ldKVtpeF90ZXN0X3NldCwgXSwKICAgICAgICAgICAgICAgICBjb2wxID0gbGNvbF93YXZlMDEsIGNvbDIgPSAnc2t5Ymx1ZTInLAogICAgICAgICAgICAgICAgIHlsYWIgPSBzZWxlY3RfdW5pdHNbaV0sIG1haW4gPSB5dmVjX3NzcDU4NVtpXSkKICAgICAgICAgICAgICAgICAKfQoKcmVzZXQoKQoKbGVnZW5kKCdib3R0b21yaWdodCcsIGxlZ2VuZCA9IGMoJ3dhdmUwMScsICd3YXZlMDEgc2VsZWN0ZWQnKSwgbHR5ID0gJ3NvbGlkJywgbHdkID0gMiwgY29sID0gYyhsY29sX3dhdmUwMSwgJ3NreWJsdWUyJyksIGluc2V0ID0gYygwLjA1LCAwLjE1KSApCgoKCmBgYAojIyBMZXZlbCA1IGlucHV0IHNwYWNlLCB3aXRoIHNlbGVjdGVkIG1lbWJlcnMKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTIsIGZpZy53aWR0aD0gMTIgfQpjb2xuYW1lcyhYX3dhdmUwMV9zdGFuZGFyZCkgPC0gMTozMgoKcGNvbCA8LSByZXAobWFrZVRyYW5zcGFyZW50KCdibGFjaycsIDI1MCksIGxlbmd0aChpeF9rZXB0X2xldmVsNSkpCnBjb2xbYyhoZWFkKGxldmVsNV9zb3J0JGl4LDEpLCAxOSAsMzEsIHRhaWwobGV2ZWw1X3NvcnQkaXgsMSkpXSA8LSAnc2t5Ymx1ZTInCnBjb2xbMzFdIDwtICdibHVlJwoKcGFpcnMoWF93YXZlMDFfc3RhbmRhcmRbaXhfa2VwdF9sZXZlbDUsXSwKICAgICAgY29sID0gcGNvbCwKICAgICAgeGxpbSA9IGMoMCwxKSwgeWxpbSA9IGMoMCwxKSwKICAgICAgcGNoID0gMTksCiAgICAgIGdhcCA9IDAsIAogICAgICBsb3dlci5wYW5lbCA9IE5VTEwKKQoKcmVzZXQoKQpsZWdlbmQoJ2xlZnQnLCBsZWdlbmQgPSBwYXN0ZSgxOjMyLCBjb2xuYW1lcyhsaHNfaSkpLCBjZXggPSAxLCBidHkgPSAnbicpCgoKYGBgCiMgSW5kaWNlcyBpbiB0aGUgZGVzaWduIG9mIHRoZSB0ZXN0IHNldAoKYGBge3J9CgojaXhfdGVzdF9zZXQKbmVucyA8LSA0OTk6OTk5CgpwcmludChwYXN0ZTAoJ3BhcmFtLXBlcnR1cmItUDAnLCBuZW5zW2l4X3Rlc3Rfc2V0XSwnLmNvbmYnKSkKbmVuc1tpeF90ZXN0X3NldF0KCmBgYAoKCmBgYHtyfQoKIyBYX3N0YW5fbm9ybSA8LSBub3JtYWxpemUobWF0cml4KHJlcCgxLCAzMiksIG5yb3cgPSAxKSwgd3J0ID0gbGhzKQojIAojIGNvbG5hbWVzKFhfdW5pZikgPC0gMTozMgojIAojIFhfc3RhbmRhcmQgPC0gbWF0cml4KHJlcCgxLGQpLCBuY29sID0gZCwgbnJvdyA9IDEpCiMgCiMgWF9zdGFuZGFyZF9ub3JtIDwtIG5vcm1hbGl6ZShYX3N0YW5kYXJkLCB3cnQgPSBsaHMpCiMgCiMgbGhzX21pbiA8LSBhcHBseShsaHNfd2F2ZTBfd2F2ZTAxX2FsbCwgMiwgbWluKQojIGxoc19tYXggPC0gYXBwbHkobGhzX3dhdmUwX3dhdmUwMV9hbGwsMiwgbWF4KQojIAojIFhfbGV2ZWwxYV91bm5vcm0gPC0gdW5ub3JtYWxpemUoWF9sZXZlbDFhLCB1bl9taW5zID0gbGhzX21pbiwgdW5fbWF4ZXMgPSBsaHNfbWF4KQojIAojIFhfbGV2ZWwxYV93YXZlMDFfdW5ub3JtIDwtIHVubm9ybWFsaXplKFhfbGV2ZWwxYV93YXZlMDEsIHVuX21pbnMgPSBsaHNfbWluLCB1bl9tYXhlcyA9IGxoc19tYXgpCgpgYGAKCg==